array
長度是固定的,在編譯階段就會決定分配多少位址,相較於 slice
比較少用
package main
import "fmt"
func main() {
var a1 [3]int
a2 := [3]int{}
a3 := [3]int{1, 2, 3}
a4 := [...]int{1, 2, 3} // ... 代替長度,以數量推斷長度
fmt.Println(a1) // [0 0 0]
fmt.Println(a2) // [0 0 0]
fmt.Println(a3) // [1 2 3]
fmt.Println(a4) // [1 2 3]
// n := 3
// a5:= [n]int{} // 不能編譯
fmt.Println(a4[0]) // 1
fmt.Println(a4[len(a4)-1]) // 3
// 印出 index 及 value
for i, v := range a4 {
fmt.Println(i, v)
}
// 二維陣列
v1 := [3][2]int{}
v2 := [3][2]int{{1, 1}, {2, 2}, {3, 3}}
fmt.Println(v1) // [[0 0] [0 0] [0 0]]
fmt.Println(v2) // [[1 1] [2 2] [3 3]]
}
slice
可以在執行階段動態分配位址,使用上比較彈性。
package main
import "fmt"
func main() {
var a1 []int
a2 := []int{}
a3 := []int{1, 2, 3}
fmt.Println(a1) // []
fmt.Println(a2) // []
fmt.Println(a3) // [1 2 3]
// 使用 make() 建立
// func make([]T, len, cap) []T
slice := make([]int, 5)
fmt.Println(slice) // [0 0 0 0 0]
fmt.Println(len(slice)) // 5
fmt.Println(cap(slice)) // 5
}
package main
import "fmt"
func main() {
a1 := []int{}
fmt.Println(a1) // []
// 新增元素
a1 = append(a1, 1)
fmt.Println(a1) // [1]
// 建立新的 slice
a2 := a1[:]
fmt.Println(a2) // [1]
// 但是參考同樣位址,因此修改 a2 同樣會修改到 a1
a2[0] = 2
fmt.Println(a1) // [2]
// 使用 copy()
a3 := make([]int, len(a1))
copy(a3, a1)
a3[0] = 100
fmt.Println(a1) // [2]
}
package main
import "fmt"
func main() {
scores := make(map[string]int)
scores["Alice"] = 90
scores["Bob"] = 85
aliceScore := scores["Alice"]
fmt.Println(aliceScore)
// 檢查鍵是否存在
// _ 代表忽略這個回傳值
_, ok := scores["Bob"]
fmt.Println(ok)
// 刪除元素
delete(scores, "Bob")
fmt.Println("Scores:")
for key, value := range scores {
fmt.Printf("%s: %d\n", key, value)
}
}
(對比於其他程式語言就是 class
package main
import "fmt"
type Point struct {
X int
Y int
}
func main() {
var point1 Point
// 如果不指定 key,會依 struct 欄位順序給值
point2 := Point{1, 2}
// 指定 key
point3 := Point{
Y: 4,
X: 3,
}
fmt.Println(point1) // {0 0}
fmt.Println(point2) // {1 2}
fmt.Println(point3) // {3 4}
// 取欄位值
fmt.Println(point3.X, point3.Y) // 3 4
}
JSON
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// json -> struct
data := `{
"name": "Molecule Man",
"age": 29
}`
user := User{}
err := json.Unmarshal([]byte(data), &user)
if err != nil {
fmt.Println("parse error")
return
}
fmt.Println(user) // {Molecule Man 29}
// struct -> json
byteSlice, _ := json.Marshal(user)
fmt.Print(string(byteSlice)) // {"name":"Molecule Man","age":29}
}